﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NetCoreClass
{
    public static class Time
    {
        /// <summary>  
        /// 时间戳转为C#格式时间  
        /// </summary>  
        /// <param name="timeStamp">Unix时间戳格式</param>  
        /// <returns>C#格式时间</returns>  
        public static DateTime GetTime(string timeStamp)
        {
            DateTime dtStart =  TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
            long lTime = long.Parse(timeStamp + "0000000");
            TimeSpan toNow = new TimeSpan(lTime);
            return dtStart.Add(toNow);
        }


        /// <summary>  
        /// DateTime时间格式转换为Unix时间戳格式  
        /// </summary>  
        /// <param name="time"> DateTime时间格式</param>  
        /// <returns>Unix时间戳格式</returns>  
        public static int ConvertDateTimeInt(System.DateTime time)
        {
            System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
            return (int)(time - startTime).TotalSeconds;
        }
        #region timespan

        /// <summary>
        /// 取时间戳，高并发情况下会有重复。想要解决这问题请使用sleep线程睡眠1毫秒。
        /// </summary>
        /// <param name="AccurateToMilliseconds">精确到毫秒</param>
        /// <returns>返回一个长整数时间戳</returns>
        public static long GetTimeStamp(bool AccurateToMilliseconds = false)
        {
            if (AccurateToMilliseconds)
            {

                // 使用当前时间计时周期数（636662920472315179）减去1970年01月01日计时周期数（621355968000000000）除去（删掉）后面4位计数（后四位计时单位小于毫秒，快到不要不要）再取整（去小数点）。

                //备注：DateTime.Now.ToUniversalTime不能缩写成DateTime.Now.Ticks，会有好几个小时的误差。

                //621355968000000000计算方法 long ticks = (new DateTime(1970, 1, 1, 8, 0, 0)).ToUniversalTime().Ticks;

                return (System.DateTime.UtcNow.Ticks - 621355968000000000) / 10000;

            }
            else
            {
                //上面是精确到毫秒，需要在最后除去（10000），这里只精确到秒，只要在10000后面加三个0即可（1秒等于1000毫米）。
                return (System.DateTime.UtcNow.Ticks - 621355968000000000) / 10000000;
            }
        }
        #endregion

        /// <summary>
        /// 时间转换
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static string DateFromNow(this DateTime? dt)
        {
            if (dt == null)
            {
                return "";
            }
            else
            {
                return dt.DateFromNow();
              
            }
           
        }
        /// <summary>
        /// 时间转换
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static string DateFromNow(this DateTime dt)
        {
          
                TimeSpan d = (TimeSpan)(DateTime.Now - dt);
                TimeSpan span = d.Duration();
                if (span.TotalDays > 60)
                {
                    return dt.ToString("yyyy-MM-dd");
                }
                else if (span.TotalDays > 30)
                {
                    return "1个月前";
                }
                else if (span.TotalDays > 14)
                {
                    return "2周前";
                }
                else if (span.TotalDays > 7)
                {
                    return "1周前";
                }
                else if (span.TotalDays > 1)
                {
                    return string.Format("{0}天前", (int)Math.Floor(span.TotalDays));
                }
                else if (span.TotalHours > 1)
                {
                    return string.Format("{0}小时前", (int)Math.Floor(span.TotalHours));
                }
                else if (span.TotalMinutes > 1)
                {
                    return string.Format("{0}分钟前", (int)Math.Floor(span.TotalMinutes));
                }
                else if (span.TotalSeconds >= 1)
                {
                    return string.Format("{0}秒前", (int)Math.Floor(span.TotalSeconds));
                }
                else
                {
                    return "1秒前";
                }
           

        }
    }
}

